[libcxx] Fix SFINAE in <cmath>. Patch from K-Ballo. Delay instantiation of `__numeric_type` within <cmath>, don't instantiate it when the `is_arithmetic` conditions do not hold as it causes errors with user-defined types with ambiguous conversions. Fixes PR21083. git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@219998 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/cmath b/include/cmath index 4719aba..d3aa4be 100644 --- a/include/cmath +++ b/include/cmath
@@ -727,11 +727,11 @@ template <class _A1, class _A2> inline _LIBCPP_INLINE_VISIBILITY -typename enable_if +typename __lazy_enable_if < is_arithmetic<_A1>::value && is_arithmetic<_A2>::value, - typename __promote<_A1, _A2>::type + __promote<_A1, _A2> >::type atan2(_A1 __lcpp_y, _A2 __lcpp_x) _NOEXCEPT { @@ -849,11 +849,11 @@ template <class _A1, class _A2> inline _LIBCPP_INLINE_VISIBILITY -typename enable_if +typename __lazy_enable_if < is_arithmetic<_A1>::value && is_arithmetic<_A2>::value, - typename __promote<_A1, _A2>::type + __promote<_A1, _A2> >::type fmod(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT { @@ -952,11 +952,11 @@ template <class _A1, class _A2> inline _LIBCPP_INLINE_VISIBILITY -typename enable_if +typename __lazy_enable_if < is_arithmetic<_A1>::value && is_arithmetic<_A2>::value, - typename __promote<_A1, _A2>::type + __promote<_A1, _A2> >::type pow(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT { @@ -1114,11 +1114,11 @@ template <class _A1, class _A2> inline _LIBCPP_INLINE_VISIBILITY -typename enable_if +typename __lazy_enable_if < is_arithmetic<_A1>::value && is_arithmetic<_A2>::value, - typename __promote<_A1, _A2>::type + __promote<_A1, _A2> >::type copysign(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT { @@ -1192,11 +1192,11 @@ template <class _A1, class _A2> inline _LIBCPP_INLINE_VISIBILITY -typename enable_if +typename __lazy_enable_if < is_arithmetic<_A1>::value && is_arithmetic<_A2>::value, - typename __promote<_A1, _A2>::type + __promote<_A1, _A2> >::type fdim(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT { @@ -1216,12 +1216,12 @@ template <class _A1, class _A2, class _A3> inline _LIBCPP_INLINE_VISIBILITY -typename enable_if +typename __lazy_enable_if < is_arithmetic<_A1>::value && is_arithmetic<_A2>::value && is_arithmetic<_A3>::value, - typename __promote<_A1, _A2, _A3>::type + __promote<_A1, _A2, _A3> >::type fma(_A1 __lcpp_x, _A2 __lcpp_y, _A3 __lcpp_z) _NOEXCEPT { @@ -1242,11 +1242,11 @@ template <class _A1, class _A2> inline _LIBCPP_INLINE_VISIBILITY -typename enable_if +typename __lazy_enable_if < is_arithmetic<_A1>::value && is_arithmetic<_A2>::value, - typename __promote<_A1, _A2>::type + __promote<_A1, _A2> >::type fmax(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT { @@ -1266,11 +1266,11 @@ template <class _A1, class _A2> inline _LIBCPP_INLINE_VISIBILITY -typename enable_if +typename __lazy_enable_if < is_arithmetic<_A1>::value && is_arithmetic<_A2>::value, - typename __promote<_A1, _A2>::type + __promote<_A1, _A2> >::type fmin(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT { @@ -1290,11 +1290,11 @@ template <class _A1, class _A2> inline _LIBCPP_INLINE_VISIBILITY -typename enable_if +typename __lazy_enable_if < is_arithmetic<_A1>::value && is_arithmetic<_A2>::value, - typename __promote<_A1, _A2>::type + __promote<_A1, _A2> >::type hypot(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT { @@ -1459,11 +1459,11 @@ template <class _A1, class _A2> inline _LIBCPP_INLINE_VISIBILITY -typename enable_if +typename __lazy_enable_if < is_arithmetic<_A1>::value && is_arithmetic<_A2>::value, - typename __promote<_A1, _A2>::type + __promote<_A1, _A2> >::type nextafter(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT { @@ -1496,11 +1496,11 @@ template <class _A1, class _A2> inline _LIBCPP_INLINE_VISIBILITY -typename enable_if +typename __lazy_enable_if < is_arithmetic<_A1>::value && is_arithmetic<_A2>::value, - typename __promote<_A1, _A2>::type + __promote<_A1, _A2> >::type remainder(_A1 __lcpp_x, _A2 __lcpp_y) _NOEXCEPT { @@ -1520,11 +1520,11 @@ template <class _A1, class _A2> inline _LIBCPP_INLINE_VISIBILITY -typename enable_if +typename __lazy_enable_if < is_arithmetic<_A1>::value && is_arithmetic<_A2>::value, - typename __promote<_A1, _A2>::type + __promote<_A1, _A2> >::type remquo(_A1 __lcpp_x, _A2 __lcpp_y, int* __lcpp_z) _NOEXCEPT {